home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 21 / Cream of the Crop 21 (Terry Blount) (October 1996).iso / faq / vol15n14.zip / DDGAME.ZIP / SPACEFRA.CPP < prev    next >
C/C++ Source or Header  |  1996-04-17  |  20KB  |  797 lines

  1. // SpaceFrame.cpp : implementation file
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "SpaceFrame.h"
  6. #include "Error.h"
  7. #include "animation.h"
  8.  
  9. #include <mmsystem.h>
  10.  
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16.  
  17. double DirX[32] =
  18. {
  19.   0.000000,
  20.   0.195090,
  21.   0.382683,
  22.   0.555570,
  23.   0.707107,
  24.   0.831470,
  25.   0.923880,
  26.   0.980785,
  27.   1.000000,
  28.   0.980785,
  29.   0.923880,
  30.   0.831470,
  31.   0.707107,
  32.   0.555570,
  33.   0.382683,
  34.   0.195090,
  35.   0.000000,
  36.   -0.195090,
  37.   -0.382683,
  38.   -0.555570,
  39.   -0.707107,
  40.   -0.831470,
  41.   -0.923880,
  42.   -0.980785,
  43.   -1.000000,
  44.   -0.980785,
  45.   -0.923880,
  46.   -0.831470,
  47.   -0.707107,
  48.   -0.555570,
  49.   -0.382683,
  50.   -0.195090
  51. };
  52.  
  53. double DirY[32] =
  54. {
  55.   -1.0,
  56.   -0.980785,
  57.   -0.92388,
  58.   -0.83147,
  59.   -0.707107,
  60.   -0.55557,
  61.   -0.382683,
  62.   -0.19509,
  63.   0.0,
  64.   0.19509,
  65.   0.382683,
  66.   0.55557,
  67.   0.707107,
  68.   0.83147,
  69.   0.92388,
  70.   0.980785,
  71.   1.0,
  72.   0.980785,
  73.   0.92388,
  74.   0.83147,
  75.   0.707107,
  76.   0.55557,
  77.   0.382683,
  78.   0.19509,
  79.   0.0,
  80.   -0.19509,
  81.   -0.382683,
  82.   -0.55557,
  83.   -0.707107,
  84.   -0.83147,
  85.   -0.92388,
  86.   -0.980785
  87. };
  88.  
  89. /////////////////////////////////////////////////////////////////////////////
  90. // CSpaceFrame
  91.  
  92. //-----------------------------------------------------------------------------
  93. // default constructor
  94. //-----------------------------------------------------------------------------
  95. CSpaceFrame::CSpaceFrame()
  96. {
  97.   m_pFrameRateSurface = NULL;
  98.  
  99.     m_dwStartTime = 0;
  100.     m_nFrameCount = 0;
  101.   m_nFrameRate= 0;
  102.  
  103.   m_ddbltfx.dwSize = sizeof(DDBLTFX);
  104.   m_ddsd.dwSize = sizeof(DDSURFACEDESC);
  105.  
  106.   m_nLives = 3;
  107.   m_nTurnDelay = 0;
  108.   m_nLevel = 0;
  109. }
  110.  
  111. CSpaceFrame::~CSpaceFrame()
  112. {
  113. }
  114.  
  115. //-----------------------------------------------------------------------------
  116. // GetWindowTitle
  117. //-----------------------------------------------------------------------------
  118. CString CSpaceFrame::GetWindowTitle()
  119. {
  120.   return "Space Demo";
  121. }
  122.  
  123. //-----------------------------------------------------------------------------
  124. // UpdateGame
  125. //-----------------------------------------------------------------------------
  126. BOOL CSpaceFrame::UpdateGame()
  127. {
  128.   // If its ESC, we quit the app
  129.     if (::GetAsyncKeyState(VK_ESCAPE) < 0)
  130.     {
  131.         return FALSE;
  132.     }
  133.  
  134.   MoveSprites();
  135.   CollideSprites();
  136.   
  137.   // out of lives, game over man
  138.   if (m_nLives <= 0)
  139.   {
  140.     DisplayMessage("Game Over");
  141.     return FALSE;
  142.   }
  143.  
  144.   // Erase the background
  145.   m_ddbltfx.dwFillColor = 0;
  146.   while (TRUE)
  147.   {
  148.     HRESULT ddrval;
  149.     ddrval = m_pBackBuffer->Blt(NULL, NULL, NULL, DDBLT_COLORFILL, &m_ddbltfx);
  150.     if (ddrval == DD_OK)
  151.       break;
  152.  
  153.     if (ddrval == DDERR_SURFACELOST)
  154.       if (!RestoreSurfaces())
  155.           return FALSE;
  156.  
  157.     if (ddrval != DDERR_WASSTILLDRAWING)
  158.       break;
  159.   }
  160.  
  161.   DrawSprites();
  162.  
  163.   DrawText();
  164.  
  165.   // Everyhting is ready in the back buffer, so flip
  166.   m_pFrontBuffer->Flip(NULL, DDFLIP_WAIT);
  167.  
  168.   return TRUE;
  169. }
  170.  
  171. //-----------------------------------------------------------------------------
  172. // MoveSprites
  173. //-----------------------------------------------------------------------------
  174. void CSpaceFrame::MoveSprites()
  175. {
  176.   SPRITE *pHold, *pCurr;
  177.   BOOL bCollision;
  178.   int nNumEnemies = 0;
  179.  
  180.   pCurr = &m_head;
  181.   // move the sprites and detect edge of screen hits
  182.   do
  183.   {
  184.     switch (pCurr->eType) 
  185.     {
  186.       case typeShip:
  187.         pCurr->nDelay++;
  188.         if (pCurr->nDelay >= ANIM_DELAY)
  189.         {
  190.           pCurr->nDelay = 0;
  191.  
  192.           if (::GetAsyncKeyState(VK_CONTROL) < 0)
  193.           {
  194.             AddSprite(typeBullet, pCurr->dPosX, pCurr->dPosY);
  195.           }
  196.         }
  197.  
  198.         if (::GetAsyncKeyState(VK_RIGHT) < 0)
  199.         {
  200.           if (m_nTurnDelay > TURN_DELAY)
  201.           {
  202.             m_nTurnDelay = 0;
  203.  
  204.             ++pCurr->nDirection;
  205.             if (pCurr->nDirection >= NUM_DIRECTIONS)
  206.               pCurr->nDirection = 0;
  207.           }
  208.           else
  209.             m_nTurnDelay++;
  210.         }
  211.  
  212.         if (::GetAsyncKeyState(VK_LEFT) < 0)
  213.         { 
  214.           if (m_nTurnDelay > TURN_DELAY)
  215.           {
  216.             m_nTurnDelay = 0;
  217.             --pCurr->nDirection;
  218.             if (pCurr->nDirection < 0)
  219.               pCurr->nDirection = NUM_DIRECTIONS - 1;
  220.           }
  221.           else
  222.             m_nTurnDelay++;
  223.         }
  224.  
  225.         if (::GetAsyncKeyState(VK_UP) < 0)
  226.         {
  227.           pCurr->dVelX += DirX[pCurr->nDirection] / 10;
  228.           pCurr->dVelY += DirY[pCurr->nDirection] / 10;
  229.         }
  230.  
  231.         if (::GetAsyncKeyState(VK_DOWN) < 0)
  232.         {
  233.           pCurr->dVelX = 0.0;
  234.           pCurr->dVelY = 0.0;
  235.         }
  236.  
  237.  
  238.         pCurr->dPosX += pCurr->dVelX;
  239.         pCurr->dPosY += pCurr->dVelY;
  240.  
  241.         pCurr->nFrame = pCurr->nDirection;
  242.         
  243.         break;
  244.  
  245.       case typeEnemy:
  246.         nNumEnemies++;
  247.       case typeBullet:
  248.         pCurr->dPosX += pCurr->dVelX;
  249.         pCurr->dPosY += pCurr->dVelY;
  250.  
  251.         pCurr->nDelay++;
  252.         if (pCurr->nDelay >= ANIM_DELAY)
  253.         {
  254.           pCurr->nDelay = 0;
  255.           pCurr->nFrame++;
  256.           if (pCurr->nFrame >= pCurr->pAnim->GetNumFrames())
  257.             pCurr->nFrame = 0;
  258.         }
  259.  
  260.         break;
  261.     } 
  262.  
  263.     // reverse direction when hitting edge of world
  264.     bCollision = FALSE;
  265.     if (int(pCurr->dPosX) < WORLD_MIN_X)
  266.     {
  267.       pCurr->dVelX *= -1;
  268.       pCurr->dPosX = WORLD_MIN_X;
  269.       bCollision = TRUE;
  270.     }
  271.  
  272.     if (int(pCurr->dPosY) < WORLD_MIN_Y)
  273.     {
  274.       pCurr->dVelY *= -1;
  275.       pCurr->dPosY = WORLD_MIN_Y;
  276.       bCollision = TRUE;
  277.     }
  278.  
  279.     if ((int(pCurr->dPosX) + pCurr->pAnim->GetWidth()) > WORLD_MAX_X)
  280.     {
  281.       pCurr->dVelX *= -1;
  282.       pCurr->dPosX = WORLD_MAX_X - pCurr->pAnim->GetWidth();
  283.       bCollision = TRUE;
  284.     }
  285.  
  286.     if ((int(pCurr->dPosY) + pCurr->pAnim->GetHeight()) > WORLD_MAX_Y)
  287.     {
  288.       pCurr->dVelY *= -1;
  289.       pCurr->dPosY = WORLD_MAX_Y - pCurr->pAnim->GetHeight();
  290.       bCollision = TRUE;
  291.     } 
  292.     
  293.     // remove bullets if they go off the edge of the world 
  294.     if (typeBullet == pCurr->eType && bCollision)
  295.     {
  296.       pHold = pCurr->pNext;
  297.       RemoveSprite(pCurr);
  298.       pCurr = pHold;
  299.     }
  300.     else
  301.       pCurr = pCurr->pNext;
  302.  
  303.   } while (pCurr != &m_head);
  304.  
  305.   if (nNumEnemies == 0)
  306.   {
  307.     KillLevel();
  308.     InitLevel();
  309.   }
  310. }
  311.  
  312. //-----------------------------------------------------------------------------
  313. // CollideSprites
  314. //-----------------------------------------------------------------------------
  315. void CSpaceFrame::CollideSprites()
  316. {
  317.   SPRITE *pHold, *pTarget, *pCurr;
  318.   BOOL bCollision;
  319.  
  320.   pCurr = &m_head;
  321.   do
  322.   {
  323.     bCollision = FALSE;
  324.     if (pCurr->eType != typeBullet && pCurr->eType != typeShip)
  325.     {
  326.       pCurr = pCurr->pNext;
  327.       continue;
  328.     }
  329.  
  330.     pTarget = m_head.pNext;
  331.     do
  332.     {
  333.       if (pTarget->eType == typeBullet || pTarget == pCurr)
  334.       {
  335.         pTarget = pTarget->pNext;
  336.         continue;
  337.       }
  338.       
  339.       int nX = int(pCurr->dPosX) + (pCurr->pAnim->GetWidth() / 2);
  340.       int nY = int(pCurr->dPosY) + (pCurr->pAnim->GetHeight() / 2);
  341.  
  342.       if (nX > pTarget->dPosX &&
  343.           nY > pTarget->dPosY &&
  344.           nX < (pTarget->dPosX + pTarget->pAnim->GetWidth()) &&
  345.           nY < (pTarget->dPosY + pTarget->pAnim->GetHeight()))
  346.       {
  347.         bCollision = TRUE;
  348.  
  349.         pHold = pTarget->pNext;
  350.         RemoveSprite(pTarget);
  351.         pTarget = pHold;
  352.       }  
  353.       else
  354.         pTarget = pTarget->pNext;
  355.     } while (pTarget != &m_head);
  356.  
  357.     if (bCollision)
  358.     {
  359.       if (pCurr->eType == typeShip)
  360.       {
  361.         m_nLives--;
  362.  
  363.         m_head.dPosX = 300.0;
  364.         m_head.dPosY = 200.0;
  365.         m_head.dVelX = 0.0;
  366.         m_head.dVelY = 0.0;
  367.         m_head.nDirection = m_head.nFrame = m_head.nDelay = 0;
  368.       }
  369.       else
  370.       {
  371.         pHold = pCurr->pNext;
  372.         RemoveSprite(pCurr);
  373.         pCurr = pHold;
  374.       }
  375.     }
  376.     else
  377.       pCurr = pCurr->pNext;
  378.   } while (pCurr != &m_head);  
  379. }
  380.  
  381. //-----------------------------------------------------------------------------
  382. //